<?php
use \Curl\Curl;

if (!function_exists('cutstr')) {
	/*
     *
     * 字符串截取
     * $string  需要截取的字符串
     * $len     需要截取的长度
     * $ellipsis  截取后 需要添加的省略符号  默认“…”
     * $encoding  字符编码  默认utf-8
     * */
	function cutstr($string, $len, $ellipsis = "...", $encoding = 'utf8')
	{
		if (mb_strlen($string, $encoding) <= $len) {
			return $string;
		} else {
			return mb_substr($string, 0, $len, $encoding) . $ellipsis;
		}
	}
}

/*设置log格式化*/
if (!function_exists('get_api_log_params')) {
	function get_api_log_params($url, $message, array $getParam = [], array $postParam = [])
	{
		return [
				'third_url'   => $url,
				'app_message' => $message,
				'get_params'  => json_encode($getParam),
				'body_params' => json_encode($postParam),
		];
	}
}

if (!function_exists('generateToken')) {
	/*
	 * 请求GVS外网接口token
	 * $appname
	 * $appkey
	 * */
	function generateToken($appname, $appKey)
	{
		$iv = openssl_random_pseudo_bytes(16);
		list($timeInt, $timeFloat) = explode(' ', microtime());
		$time = sprintf('%.0f', ($timeInt + $timeFloat) * 1000);
		$data = $time . "|" . $appname;

		// encrypt 加密
		$encrypted = openssl_encrypt($data, 'AES-128-CBC', $appKey, OPENSSL_RAW_DATA, $iv);

		// 16 进制转换
		return bin2hex($iv) . bin2hex($encrypted);
	}
}


/**---------------------------------------curl reuqest-----------------------------------
 * @params $url        请求链接
 * @params $params    get, post，put传递数据        []
 */
if (!function_exists('get_data')) {
	function get_data($url, $params = [])
	{
		$curl = new Curl();
		if (empty($url)) throw new Exception('Invalid Params : required param is missing');
		if (IS_DEBUG) {
			fire_debug($url, $params, 'get');
		}
		$result = $curl->get($url, $params);
		if ($curl->httpStatusCode != 200) {
			Logger::error('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
			return [];
		}
		Logger::info('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
		return $result;
	}
}

if (!function_exists('post_data')) {
	function post_data($url, $params = [])
	{
		$curl = new Curl();
		if (empty($url)) throw new Request_Exception('Invalid Params : required param is missing');
		if (IS_DEBUG) {
			fire_debug($url, $params, 'post');
		}
		$result = $curl->post($url, $params);
		if ($curl->httpStatusCode != 200) {
			Logger::error('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
			return [];
		}
		Logger::info('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
		return $result;
	}
}

/**
 ** @params $retry    重试次数   默认是0：仅请求一次无重试操作，
 */
if (!function_exists('put_data')) {
	function put_data($url, $params = [], $retry = 0)
	{
		$curl = new Curl();
		$curl->setTimeout(1);
		if (empty($url)) throw new Exception('Invalid Params : required param is missing');
		if (IS_DEBUG) {
			fire_debug($url, $params, 'put');
		}
		do {
			try {
				$result = $curl->put($url, $params);
				if (!$result) {
					throw new Exception("");
				}
				if ($curl->httpStatusCode != 200) {
					Logger::error('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
					return [];
				}
				Logger::info('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
				return $result;
			} catch (Exception $e) {
				if ($retry < config_item('retry')) {
					Logger::error('', get_api_log_params($url, "curl_http_code:" . $curl->httpStatusCode, $params));
				}
				continue;
			}
			break;
		} while ($retry--);
	}
}

if (!function_exists('fire_debug')) {
	function fire_debug($url, $data, $method)
	{
		FB::group('接口URL');
		if ($method == 'get') {
			$reqBody = http_build_query($data);
			$url     = $reqBody ? $url . $reqBody : $url;
		}
		FB::info(strtoupper($method) . ':' . $url);
		if ($method != "get") {
			FB::info($data);
		}
	}
}

/* 
     * 密码hash散列,对比密码hash散列 
     * notice : 若 hashString 为空时则默认返回 密码的hash值;否则将返回密码hash对比结果
     */
if (!function_exists('password_hashstring')) {
	function password_hashstring($password = '', $hashString = '')
	{
		if (!$password) return false;
		if (!$hashString) {
			return password_hash($password, PASSWORD_DEFAULT);
		}
		return password_verify($password, $hashString);
	}
}

/*
 * 生成指定长度不重复的随机码
 * notice : 默认类型字段为0,则返回数字+字母,否则返回数字
 */
if (!function_exists('rand_code')) {
	function rand_code($length = 4, $type = 0)
	{
		$phrase = '';
		$string = '0123456789';
		if (!$type) {
			$string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstvuwxyz0123456789';
		}
		$chars = str_split($string);
		for ($i = 0; $i < $length; $i++) {
			$code = $chars[array_rand($chars)];
			if (strpos($phrase, $code) !== false) {
				$i--;
				continue;
			}
			$phrase .= $code;
		}
		return $phrase;
	}
}

/**
 * 获取客户端IP地址
 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 * @param boolean $adv  是否进行高级模式获取（有可能被伪装）
 * @return mixed
 */
if (!function_exists('get_client_ip')) {
	function get_client_ip($type = 0, $adv = false)
	{
		$type = $type ? 1 : 0;
		static $ip = NULL;
		if ($ip !== NULL) return $ip[$type];
		if ($adv) {
			if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
				$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
				$pos = array_search('unknown', $arr);
				if (false !== $pos) unset($arr[$pos]);
				$ip = trim($arr[0]);
			} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
				$ip = $_SERVER['HTTP_CLIENT_IP'];
			} elseif (isset($_SERVER['REMOTE_ADDR'])) {
				$ip = $_SERVER['REMOTE_ADDR'];
			}
		} elseif (isset($_SERVER['REMOTE_ADDR'])) {
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		// IP地址合法验证
		$long = sprintf("%u", ip2long($ip));
		$ip   = $long ? [$ip, $long] : ['0.0.0.0', 0];
		return $ip[$type];
	}
}
/**
 *中英文混合字符串长度，中文占位2，英文占位1
 */
if (!function_exists('count_string_len')) {
	function count_string_len($str)
	{
		return (strlen($str) + mb_strlen($str, 'utf-8')) / 2; //开启了php_mbstring.dll扩展
	}
}


/*
 * 验证是否是可信任的Domain
 * @param String $str
 * @return boolean
 * */
if (!function_exists('isTrustedDomain')) {
	function isTrustedDomain($referer)
	{
		$domain  = ['.gomeplus.com', '.meixincdn.com', '.atguat.net.cn', '.atguat.com.cn', '.gomein.net.cn', '.uatplus.com', '.gome.com.cn'];
		$referer = parse_url($referer);
		$isTrue  = false;
		foreach ($domain as $v) {
			if (stripos($referer['host'], $v)) {
				$isTrue = true;
				break;
			}
		}
		return $isTrue;
	}
}

/*
 * 返回区域信息
 * @return
 *	array(
 *		'provId' => '11000000',	//一级区域ID
 *		'cityId' '11010000',	//二级区域ID
 *		'borId' => '默认（11010200',	//三级区域ID
 *		'areaId' => '110102002）',		//四级区域ID
 *		'address' => '北京北京市朝阳区朝外街道'	//详细信息
)
 * note：
 *		优先级：cookie -》 默认（11010200|北京北京市朝阳区朝外街道|11010000|11000000|110102002）
 *				三级区域|区域描述|二级区域|一级区域|四级区域
 */
function getAddrGome()
{
	if (!empty($_COOKIE['atgregion'])) {
		$addrStr = $_COOKIE['atgregion'];
	} else {
		$addrStr = '11010200|北京北京市朝阳区朝外街道|11010000|11000000|110102002';
	}

	$addrArr   = explode('|', $addrStr);
	$returnArr = [
			'provId'  => empty($addrArr[3]) ? '' : $addrArr[3],
			'cityId'  => empty($addrArr[2]) ? '' : $addrArr[2],
			'borId'   => empty($addrArr[0]) ? '' : $addrArr[0],
			'areaId'  => empty($addrArr[4]) ? '' : $addrArr[4],
			'address' => empty($addrArr[1]) ? '' : $addrArr[1]
	];

	return $returnArr;
}

//jsonp 解码
function jsonp_decode($jsonp, $assoc = false)
{
	if ($jsonp[0] !== '[' && $jsonp[0] !== '{') {
		$jsonp = substr($jsonp, strpos($jsonp, '('));
	}
	return json_decode(trim($jsonp, '();'), $assoc);
}

/**
 * 从图床获取所需尺寸的图片
 * @param $orgin_url 	原始url,必选
 * @param $width	 	需要图片宽度,必选
 * @param $hight		需要图片高度,若传递0则为高自适应状态，必选
 * @param $source_type	美信图床:MEIXIN,在线图床:ONLINE,GFS 为默认
 * @$action c为裁剪 t为图片压缩
 */
function getResizeImg($orgin_url,$width,$hight=0,$source_type='GFS',$action='c'){
	$orgin_url = str_replace(['http:','https:'], '', $orgin_url);
	if(!$orgin_url || !$width){
		return $orgin_url;
	}
	//验证图片域名是否是已知图片服务器域名
	$availHost = array(
			'.meixincdn.com',
			'.atguat.net.cn',
			'.gomein.net.cn'
	);
	$img_arr = explode('/',$orgin_url);
	$isTrue = false;
	foreach ($availHost as $host){
		if( strpos($img_arr[2],$host)){
			$isTrue = true;
			break;
		}
	}
	if(!$isTrue) return $orgin_url;
	// 如果图片是img.atguat.net.cn或img.gomein.net.cn则返回原图
	if(substr($img_arr[2], 0,3) == 'img'){
		return $orgin_url;
	}
	switch ($source_type)
	{
		case 'MEIXIN':
			$imgUrl = getMeixinImg($orgin_url,$width,$hight);
			break;
		case 'ONLINE':
			$imgUrl = getGomeResizeImg($orgin_url,$width,$hight);
			break;
		default :
			$imgUrl = getGFSResizeImg($orgin_url,$width,$hight,$action);
			break;
	}
	return $imgUrl;
}

/**
 * 美信和商城图片服务融合后的裁图方法
 * @param $orgin_url 	原始url,必选
 * @param $width	 	需要图片宽度,必选
 * @param $hight		需要图片高度,若传递0则为高自适应状态，必选
 * @$action c为裁剪 t为按比例缩小
 */
function getGFSResizeImg($orgin_url,$width,$hight,$action){
	$imgSize = config_item('gomeAllImgSze')['cutSize'];
	$thumbnailSize = config_item('gomeAllImgSze')['thumbnailSize'];
	//$hight = (intval($hight)===0)?'auto':$hight;
	$img_key = $width.'_'.$hight;
	$imgSizeArr = ($action == 'c') ? $imgSize : $thumbnailSize;
	if(in_array($img_key ,$imgSizeArr)){
		$defaultExt = '.jpg';
		
		$img_url = pathinfo($orgin_url);
		
		//如果是Gif图片则不裁图
		if($img_url['extension'] == 'gif'){
			return str_replace('gif','jpg',$orgin_url);
		}
		//忽略默认图片
		if(stripos($img_url['filename'],'default') !== false){
			return $orgin_url;
		}
		$img_arr = explode('/',$orgin_url);
		
		//判断图片地址中是否有类似_100_56和_100的尺寸，将其替换为空
		$img_url_array = explode('_',$img_url['filename']);
		
		$repString = '';
		foreach ($img_url_array as $img){
			$img = str_replace('c','',$img);
			$repString .= is_numeric($img) ? '_'.$img : '';
		}
		
		$tmpString = (substr_count($repString,'_') == 1) ? $repString.$repString : $repString;
		$tmpString = ltrim($tmpString,'_');
		$repString = ltrim($repString,'_');
		
		if($tmpString && ( in_array($tmpString,$imgSize) || in_array($tmpString, $thumbnailSize)) ) {
			$orgin_url = str_replace(['_'.$repString,'_c'.$repString], '',$orgin_url);
		}
		//根据$width,$hight，拼接一个新的图片链接
		if(isset($img_arr[0]) && isset($img_arr[2]) && isset($img_url['filename']) ){
			$newImgExt = ($action == 'c') ? '_c'.$img_key.$defaultExt : '_'.$img_key.$defaultExt ;
			
			return preg_replace("/.(png|jpg|jpeg|gif).*$/", $newImgExt, $orgin_url);
		}
	}
	return $orgin_url;
}
/**
 * 从美信图床获取所需尺寸的图片
 * @param $orgin_url 	原始url,必选
 * @param $width	 	需要图片宽度,必选
 * @param $hight		需要图片高度,若传递0则为高自适应状态，必选
 */
function getMeixinImg($orgin_url,$width,$hight){
	$imgSize = config_item('allImgSze');
	$hight = (intval($hight)===0)?'auto':$hight;
	$img_key = $width.'x'.$hight;
	if(isset($imgSize[$img_key])){
		$defaultExt = 'jpg';
		
		$img_url = pathinfo($orgin_url);
		//忽略默认图片
		if(stripos($img_url['filename'],'default') !== false){
			return $orgin_url;
		}
		$img_arr = explode('/',$img_url['dirname']);
		if(isset($img_arr[0]) && isset($img_arr[2]) && isset($img_url['filename'])){
			return str_replace('.gif','.jpg',$orgin_url).'.'.$imgSize[$img_key].'.'.$defaultExt;
		}
	}
	return $orgin_url;
}

/**
 * 从在线图床获取所需尺寸的图片
 * @param $orgin_url 	原始url,必选
 * @param $width	 	需要图片宽度,必选
 * @param $hight		需要图片高度,若传递0则为高自适应状态，必选
 * @return url
 */
function getGomeResizeImg($orgin_url,$width,$hight=0){
	
	$img_info = pathinfo($orgin_url);
	
	if(isset($img_info['extension']) && !in_array($img_info['extension'], ['jpg','jpeg','png','gif'])){
		$img_info['filename'] = $img_info['filename'].".".$img_info['extension'];
		unset($img_info['extension']);
	}
	$img_info['extension'] = isset($img_info['extension']) ? $img_info['extension'] : 'jpg';
	$last = substr($img_info['filename'], strrpos($img_info['filename'], '_')+1);
	
	$gomeAllImgSze = config_item('gomeAllImgSze');
	
	if($last && ( in_array($last."_".$last,$gomeAllImgSze['GFS']) || in_array($last, $gomeAllImgSze['IMG'])) ) {
		$img_info['filename'] = str_replace('_'.$last, '', $img_info['filename']);
	}
	$dirname_info = explode('//', $img_info['dirname']);
	$img_url = $orgin_url;
	if(isset($dirname_info[1])){
		$type = substr($dirname_info[1], 0,3);
		if($type == 'img'){
			$imgSize = $gomeAllImgSze['IMG'];
			if(in_array($width, $imgSize)){
				$img_url = $img_info['dirname']."/".$img_info['filename']."_".$width.".".$img_info['extension'];
			}
			
		}else if($type == 'gfs'){
			$img_key = $width.'_'.$hight;
			$imgSize = $gomeAllImgSze['GFS'];
			if(in_array($img_key, $imgSize)){
				$img_url = $img_info['dirname']."/".$img_info['filename']."_".$img_key.".".$img_info['extension'];
			}
		}
	}
	return $img_url;
	
	
	
	// $string： 明文 或 密文
	// $operation：DECODE表示解密,其它表示加密
	// $key： 密匙
	// $expiry：密文有效期
	function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
	{
		// 动态密匙长度，相同的明文会生成不同密文就是依靠动态密匙
		$ckey_length = 4;
		// 密匙
		$key = md5($key ? $key : C('AU_KEY'));
		// 密匙a会参与加解密
		$keya = md5(substr($key, 0, 16));
		// 密匙b会用来做数据完整性验证
		$keyb = md5(substr($key, 16, 16));
		// 密匙c用于变化生成的密文
		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
		// 参与运算的密匙
		$cryptkey = $keya.md5($keya.$keyc);
		$key_length = strlen($cryptkey);
		// 明文，前10位用来保存时间戳，解密时验证数据有效性，10到26位用来保存$keyb(密匙b)，解密时会通过这个密匙验证数据完整性
		// 如果是解码的话，会从第$ckey_length位开始，因为密文前$ckey_length位保存 动态密匙，以保证解密正确
		$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
		$string_length = strlen($string);
		$result = '';
		$box = range(0, 255);
		$rndkey = array();
		// 产生密匙簿
		for($i = 0; $i <= 255; $i++)
		{
			$rndkey[$i] = ord($cryptkey[$i % $key_length]);
		}
		// 用固定的算法，打乱密匙簿，增加随机性，好像很复杂，实际上对并不会增加密文的强度
		for($j = $i = 0; $i < 256; $i++)
		{
			$j = ($j + $box[$i] + $rndkey[$i]) % 256;
			$tmp = $box[$i];
			$box[$i] = $box[$j];
			$box[$j] = $tmp;
		}
		// 核心加解密部分
		for($a = $j = $i = 0; $i < $string_length; $i++)
		{
			$a = ($a + 1) % 256;
			$j = ($j + $box[$a]) % 256;
			$tmp = $box[$a];
			$box[$a] = $box[$j];
			$box[$j] = $tmp;
			// 从密匙簿得出密匙进行异或，再转成字符
			$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
		}
		if($operation == 'DECODE')
		{
			// substr($result, 0, 10) == 0 验证数据有效性
			// substr($result, 0, 10) - time() > 0 验证数据有效性
			// substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
			// 验证数据有效性，请看未加密明文的格式
			if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16))
			{
				return substr($result, 26);
			}
			else
			{
				return '';
			}
		}
		else
		{
			// 把动态密匙保存在密文里，这也是为什么同样的明文，生产不同密文后能解密的原因
			// 因为加密后的密文可能是一些特殊字符，复制过程可能会丢失，所以用base64编码
			return $keyc.str_replace('=', '', base64_encode($result));
		}
	}
	
	
}

function get_whole_url($pathInfo){
	if(!strpos($pathInfo,'http')){
		$APP_HTTP = @$_SERVER['HTTP_X_FORWARDED_PROTO'] == "https" ? 'https://' : 'http://';
		$pathInfo = $APP_HTTP.str_replace('//','',$pathInfo);
	}
	return $pathInfo;
}

